#!/bin/bash

# 检查参数数量
if [ "$#" -lt 3 ]; then
    echo "Usage: $0 <program> <sleep_seconds> <input_to_program...>"
    exit 1
fi

PROGRAM=$1
SLEEP_SECONDS=$2
shift 2

# 使用 valgrind 和 perf 前先启动程序并让它等待输入
# 使用命名管道（FIFO）来处理输入
PIPE=/tmp/fifo_$$
mkfifo $PIPE

# 在后台启动程序，重定向管道作为输入
valgrind --tool=massif --massif-out-file=massif.out $PROGRAM < $PIPE &
PERF_PID=$!
perf record -e cache-misses,cache-references,instructions,cycles -p $PERF_PID -o perf.data &

echo "begin to wait program start"
# 等待程序启动
sleep 20
echo "wait done"


# 循环遍历所有剩余的参数，每个参数间隔指定时间
for INPUT in "$@"; do
    echo "$INPUT" > $PIPE
    sleep $SLEEP_SECONDS
done

# 发送退出命令到程序，结束程序
echo "!exit" > $PIPE
wait $PERF_PID

# 生成内存和性能报告
ms_print massif.out > memory_report.txt
perf report -i perf.data > perf_report.txt

# 清理命名管道
rm $PIPE

echo "Memory and performance report generated."
echo "Memory usage report saved to memory_report.txt"
echo "Perf report saved to perf_report.txt"
